<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- saved from url=(0039)http://www.redis.cn/topics/signals.html -->
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

    <link href="./Redis中文资料站_files/styles.css" rel="stylesheet" type="text/css">
    <link href="http://www.redis.cn/images/favicon.png" rel="shortcut icon">
    <script src="./Redis中文资料站_files/jquery.min.1.4.js"></script>
    <script src="./Redis中文资料站_files/app.js"></script>
    <meta content="width=device-width, minimum-scale=1.0, maximum-scale=1.0" name="viewport">
    <title>Redis中文资料站</title>
    <meta http-equiv="description" content="redis中文资料站，下载安装redis，查找redis常用命令（commands），选择适合的redis客户端方式，配置redis主从（master-slave），阅读redis官方文档，社区里了解更多redis信息，提交redis的bug。">
</head>
<body class="">
    <script src="./Redis中文资料站_files/head.js"></script>
    <header>      <div class="container">        <a href="http://www.redis.cn/">          <img alt="Redis" height="30" src="./Redis中文资料站_files/redis.png" width="93">        </a>        <nav>          <a href="http://www.redis.cn/commands.html">命令</a>          <a href="http://www.redis.cn/clients.html">客户端</a>          <a href="http://www.redis.cn/documentation.html">文档</a>          <a href="http://www.redis.cn/community.html">社区</a>          <a href="http://www.redis.cn/download.html">下载</a>          <a href="https://github.com/antirez/redis/issues" target="_blank">问题</a>          <a href="http://redis.com.cn/" target="_blank">论坛</a>          <a href="http://www.redis.cn/update.html">更新日志</a>        </nav>      </div>    </header>
    <div class="text">
        <article id="topic">
        
        <h1>Redis信号处理</h1>
        
        
          <p>本文档提供的信息是有关Redis是如何应对不同POSIX系统下产生的信号异常，比如<code>SIGTERM</code>,<code>SIGSEGV</code>等等。</p>
          <p>本文档中的信息<strong>只适用于Redis2.6或更高版本</strong>。</p>
          <h2>SIGTERM信号的处理</h2>
          <p><code>SIGTERM</code>信号会让Redis安全的关闭。Redis收到信号时并不立即退出，而是开启一个定时任务，这个任务就类似执行一次<a href="http://www.redis.cn/commands/shutdown.html">SHUTDOWN</a>命令的。
            这个定时关闭任务会在当前执行命令终止后立即施行，因此通常有有0.1秒或更少时间延迟。</p>
          <p>万一Server被一个耗时的LUA脚本阻塞，如果这个脚本可以被<code>SCRIPT KILL</code>命令终止，那么定时执行任务就会在脚本被终止后立即执行，否则直接执行。</p>
          <p>这种情况下的Shutdown过程也会同时包含以下的操作：</p>
          <ul>
              <li>如果存在正在执行RDB文件保存或者AOF重写的子进程，子进程被终止。</li>
              <li>如果AOF功能是开启的，Redis会通过系统调用<code>fsync</code>将AOF缓冲区数据强制输出到硬盘。</li>
              <li>如果Redis配置了使用RDB文件进行持久化，那么此时就会进行同步保存。由于保存时同步的，那也就不需要额外的内存。</li>
              <li>如果Server是守护进程，PID文件会被移除。</li>
              <li>如果Unix域的Socket是可用的，它也会被移除。</li>
              <li>Server退出，退出码为0.</li>
          </ul>
        <p>万一RDB文件保存失败，Shutdown失败，Server则会继续运行以保证没有数据丢失。自从Redis2.6.11之后，Redis不会再次主动Shutdown，除非它接收到了另一个<code>SIGTERM</code>信号或者另外一个<a href="http://www.redis.cn/commands/shutdown.html">SHUTDOWN</a>命令</p>
        <h2>SIGSEGV,SIGBUS,SIGFPF和SIGILL信号的处理</h2>
        
        
          <p>Redis接收到以下几种信号时会崩溃：</p>
        
        <ul>
        <li>SIGSEGV</li>
        <li>SIGBUS</li>
        <li>SIGFPE</li>
        <li>SIGILL</li>
        </ul>
        <p>如果以上信号被捕获，Redis会终止所有正在进行的操作，并进行以下操作：</p>
        <ul>
            <li>包括调用栈信息，寄存器信息，以及clients信息会以bug报告的形式写入日志文件。</li>
            <li>自从Redis2.8（当前为开发版本）之后，Redis会在系统崩溃时进行一个快速的内存检测以保证系统的可靠性。</li>
            <li>如果Server是守护进程，PID文件会被移除。</li>
            <li>最后server会取消自己对当前所接收信号的信号处理器的注册，并重新把这个信号发给自己，这是为了保证一些默认的操作被执行，比如把Redis的核心Dump到文件系统。</li>
        </ul>
        <h2>子进程被终止时会发生什么</h2>
        
        
        <p>当一个正在进行AOF重写的子进程被信号终止，Redis会把它当成一个错误并丢弃这个AOF文件(可能是部分或者完全损坏)。AOF重写过程会在以后被重新触发。</p>
        
    
        <p>当一个正在执行RDB文件保存的子进程被终止Redis会把它当做一个严重的错误，因为AOF重写只会导致AOF文件冗余，但是RDB文件保存失败会导致Redis不可用。</p>
        
          <p>
              如果一个正在保存RDB文件的子进程被信号终止或者自身出现了错误(非0退出码)，Redis会进入一种特殊的错误状态，不允许任何写操作。
          </p>
          <ul>
              <li>Redis会继续回复所有的读请求。</li>
              <li>Redis会回复给所有的写请求一个<code>MISCONFIG</code>错误。</li>
          </ul>
          <p>
                此错误状态只需被清楚一次就可以进行成功创建数据库文件。
          </p>
        
        
          <h2>不触发错误状态的情况下终止RDB文件的保存</h2>
        
        
          <p>但是有时用户希望可以在不触发错误的情况下终止保存RDB文件的子进程。自从Redis2.6.10之后就可以使用信号<code>SIGUSR1</code>，这个信号会被特殊处理：它会像其他信号一样终止子进程，但是父进程不会检测到这个严重的错误，照常接收所有的用户写请求。</p>
      </article>
    </div>
    <script src="./Redis中文资料站_files/foot.js"></script>
    <footer>     
        <div class="sponsor">本站资源翻译自<a href="http://redis.io/" target="_blank">redis.io</a>，由<a href="http://www.redis.cn/aboutus.html">redis.cn翻译团队</a>，更新日志请点击<a href="http://www.redis.cn/update.html">这里</a>查看，翻译原文版权归redis.io官方所有，翻译不正确的地方欢迎大家指出。<br>联系Email:<a href="mailto:admin@redis.cn">admin@redis.cn</a>，redis交流群：<a href="http://www.redis.cn/topics/signals.html#">46859267</a> &nbsp; <script src="./Redis中文资料站_files/stat.php" language="JavaScript"></script><script src="./Redis中文资料站_files/core.php" charset="utf-8" type="text/javascript"></script><a href="http://www.cnzz.com/stat/website.php?web_id=3593514" target="_blank" title="站长统计">站长统计</a>      </div>    </footer>


</body>
</html>
